<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_Output extends CI_Output {

    function __construct()
    {
        parent::CI_Output();
    }
	
	
	function process_display()
	{
		$this->_display();
	}
	/**
	 * Display Output
	 *
	 * All "view" data is automatically put into this variable by the controller class:
	 *
	 * $this->final_output
	 *
	 * This function sends the finalized output data to the browser along
	 * with any server headers and profile data.  It also stops the
	 * benchmark timer so the page rendering speed and memory usage can be shown.
	 *
	 * @access	public
	 * @return	mixed
	 */		
	function _display($output = '')
	{	
		// Note:  We use globals because we can't use $CI =& get_instance()
		// since this function is sometimes called by the caching mechanism,
		// which happens before the CI super object is available.
		global $BM, $CFG;
		
		// --------------------------------------------------------------------
		
		// Set the output data
		if ($output == '')
		{
			$output =& $this->final_output;
		}
		
		
		// --------------------------------------------------------------------
		
		// Do we need to write a cache file?
		if ($this->cache_expiration > 0)
		{
			$this->_write_cache($output);
		}
		
		// --------------------------------------------------------------------

		// Parse out the elapsed time and memory usage,
		// then swap the pseudo-variables with the data
				
		$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');		
		$output = str_replace('{elapsed_time}', $elapsed, $output);
		
		$memory	 = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
		$output = str_replace('{memory_usage}', $memory, $output);		

		// --------------------------------------------------------------------
		
		// Is compression requested?
		if ($CFG->item('compress_output') === TRUE)
		{
			if (extension_loaded('zlib'))
			{
				if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
				{
					ob_start('ob_gzhandler');
				}
			}
		}

		// --------------------------------------------------------------------
		
		// Are there any server headers to send?
		if (count($this->headers) > 0)
		{
			
			foreach ($this->headers as $header)
			{
				@header($header[0], $header[1]);
			}
		}		

		// --------------------------------------------------------------------
		
		
		// Does the get_instance() function exist?
		// If not we know we are dealing with a cache file so we'll
		// simply echo out the data and exit.
		if ( ! function_exists('get_instance'))
		{
			echo $output;
			log_message('debug', "Final output sent to browser");
			log_message('debug', "Total execution time: ".$elapsed);
			return TRUE;
		}
	
		// --------------------------------------------------------------------

		// Grab the super object.  We'll need it in a moment...
		$CI =& get_instance();
		
		// include the skin file if the skin var exists
		// if not we'll use the default skin file.
		// First set the skin path, default skin file and display tag.
		
		
		$sFinalSkinPath = $CI->sSkinPath.$CI->sSkinFile.EXT;
		
		if (file_exists($sFinalSkinPath) === false)
		{
			$sFinalSkinPath = $CI->config->item('default_skin_path').$CI->config->item('default_skin_file').EXT;
		}
		
		
		
		
		if(file_exists($sFinalSkinPath))
		{
			// get the file contents
			$layout = $originalLayout = $CI->load->file($sFinalSkinPath, true);
			
			
			
			
			foreach ($CI->config->item('content_replace') as $aContentReplace) 
			{
				$output = $CI->$aContentReplace['func']($output);	
				
			}
			
			$layout = $this->process_tags('skin_tags', $originalLayout, $layout);
			
			$output = $this->process_tags('post_process_tags', $output, $output);
			
			$output = str_replace($CI->config->item('skin_output_tag'), $output, $layout);
		
		}
		
		// Do we need to generate profile data?
		// If so, load the Profile class and run it.
		if ($this->enable_profiler == TRUE)
		{
			$CI->load->library('profiler');				
										
			// If the output data contains closing </body> and </html> tags
			// we will remove them and add them back after we insert the profile data
			if (preg_match("|</body>.*?</html>|is", $output))
			{
				$output  = preg_replace("|</body>.*?</html>|is", '', $output);
				$output .= $CI->profiler->run();
				$output .= '</body></html>';
			}
			else
			{
				$output .= $CI->profiler->run();
			}
		}
		
		// --------------------------------------------------------------------

		// Does the controller contain a function named _output()?
		// If so send the output there.  Otherwise, echo it.
		if (method_exists($CI, '_output'))
		{
			$CI->_output($output);
		}
		else
		{
			echo $output;  // Send it to the browser!
		}
		
		log_message('debug', "Final output sent to browser");
		log_message('debug', "Total execution time: ".$elapsed);		
	}
	
	
	
	
	private function process_tags($sTagKey, $sProcessLayout, $sLayout)
	{
		
		// Grab the super object.  We'll need it in a moment...
		$CI =& get_instance();
		
		foreach ($CI->config->item($sTagKey) as $aSkinTag)
		{

		
			if (stristr($sProcessLayout, $aSkinTag['tag']) !== false)
			{

					
				$sSkinReplace = '';
				
				if (array_key_exists('prop', $aSkinTag) === true)
				{
					if (property_exists($CI, $aSkinTag['prop']) === true)
					{
						$sSkinReplace = $CI->$aSkinTag['prop'];
						
					}
				}
	
				if (array_key_exists('func', $aSkinTag) === false)
				{
					$sLayout = str_replace($aSkinTag['tag'], $sSkinReplace, $sLayout);
				}
				else 
				{
					$sLayout = str_replace($aSkinTag['tag'], $CI->$aSkinTag['func'](), $sLayout);
				}
			}
		}
		
		
		
		return $sLayout;
	}
}

?>